package other;

import java.util.*;

import java.util.LinkedList;
import java.util.Queue;

public class QueueToStack {
    private Queue<Integer> mainQueue;
    private Queue<Integer> auxQueue;

    public QueueToStack() {
        mainQueue = new LinkedList<>();
        auxQueue = new LinkedList<>();
    }

    // 入栈操作
    public void push(int x) {
        mainQueue.offer(x);
    }

    // 出栈操作
    public int pop() {
        if (mainQueue.isEmpty()) {
            throw new RuntimeException("Stack is empty");
        }
        // 将mainQueue中的元素（除了最后一个）全部移动到auxQueue
        while (mainQueue.size() > 1) {
            auxQueue.offer(mainQueue.poll());
        }
        // mainQueue中剩下的最后一个元素即为栈顶元素，将其出队并返回
        int topElement = mainQueue.poll();
        // 交换两个队列的角色，为下一次操作做准备
        Queue<Integer> temp = mainQueue;
        mainQueue = auxQueue;
        auxQueue = temp;
        auxQueue.clear();
        return topElement;
    }

    // 获取栈顶元素
    public int top() {
        if (mainQueue.isEmpty()) {
            throw new RuntimeException("Stack is empty");
        }
        // 类似pop操作，但不交换队列角色
        while (mainQueue.size() > 1) {
            auxQueue.offer(mainQueue.poll());
        }
        int topElement = mainQueue.peek();
        // 将之前移动到auxQueue的元素移回mainQueue
        while (!auxQueue.isEmpty()) {
            mainQueue.offer(auxQueue.poll());
        }
        // 可选：清空auxQueue，避免内存浪费
        auxQueue.clear();
        return topElement;
    }

    // 检查栈是否为空
    public boolean empty() {
        return mainQueue.isEmpty();
    }

    public static void main(String[] args) {
        QueueToStack stack = new QueueToStack();
        stack.push(1);
        stack.push(2);
        stack.push(3);
        System.out.println(stack.pop()); // 输出 3
        System.out.println(stack.top()); // 输出 2
        System.out.println(stack.empty()); // 输出 false
    }
}